package 蓝桥._2024.最大异或结点;

import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;

public class TrieTree {
    static int N = 400004;  // 最大节点数
    static int[] a = new int[N];    // 存储输入的整数
    static int[] fa = new int[N];    // 每个整数节点对应的父节点信息
    static int[] e = new int[N];    // 在字典树中每个节点的经过次数
    static int[][] son = new int[N][2]; // 子节点数组，每个节点嘴都有两个子节点
    static int tot = 1; // 字典树的总节点个数

    static List<List<Integer>> g = new ArrayList<>();    // 使用邻接表存储输入的树
    static {
        for (int i = 0; i < N; i++) g.add(new ArrayList<>());
    }


    static void insert(int x){
        int pos = 1;
        e[pos]++;
        for(int i = 30; i>=0;i--){
            int y = x>>i & 1;
            if(son[pos][y]==0) son[pos][y] = ++tot;
            pos = son[pos][y];
            e[pos]++;
        }
    }

    static void remove(int x){
        int pos = 1;
        e[pos]--;   //该节点经过的整数数量 - 1
        for(int i=30;i>=0;i--){
            int y = x >> i &1;
            if(son[pos][y]==0) son[pos][y] = ++tot; // 这个走不到的，因为节点已经存在
            pos = son[pos][y];
            e[pos]--;
        }
    }

    // 找到与x的异或值最大的节点
    static int query(int x){
        int res=0,pos=1;
        for(int i=30;i>=0;i--){
            int y = x >> i &1;
            // 存在高位值相反 & 经过该节点的次数不为0 : res最终是异或后的结果（每一次i都是值不同的位）
            if(son[pos][1-y]!=0 && e[son[pos][1-y]] >  0){ pos = son[pos][1-y];  res |= (1<<i);}
            else pos=son[pos][y];
        }
        return res;
    }


    // 两个数的异或值的大小 与 拥有不同值位的位置还是有关的：越靠左最后的异或值就越大

    public static void main(String[] args) {
        Scanner scan = new Scanner(System.in);
        int n = scan.nextInt();
        for(int i=0;i<n;i++) a[i] = scan.nextInt();
        for(int i=0;i<n;i++){
            fa[i] = scan.nextInt();
            if(fa[i]!=-1){
                g.get(fa[i]).add(i);
            }
        }
        for(int i=0;i<n;i++) insert(a[i]);
        int ans = 0;
        for(int i=0;i<n;i++){
            for (int j : g.get(i)) remove(a[j]);
            ans = Math.max(ans, query(a[i]));
            for (int j : g.get(i)) insert(a[j]);
        }
        System.out.println(ans);
    }
}
